본문으로 건너뛰기

What is VACUUM

작성일 : 2025.01.05

VACUUM이란?​

VACUUM은 PostgreSQL의 핵심 유지보수 기능으로, 데이터베이스의 "쓰레기"를 정리하고 성능을 유지하는 작업입니다.

VACUUM이 필요한 이유​

  1. MVCC(Multi-Version Concurrency Control) 처리

    • PostgreSQL은 데이터를 수정/삭제할 때 기존 데이터를 바로 제거하지 않음
    • 트랜잭션의 동시성을 위해 여러 버전의 행을 유지
    • 이로 인해 "죽은 튜플(dead tuples)"이 발생
  2. 디스크 공간 관리

    • DELETE된 데이터는 실제로 바로 삭제되지 않음
    • UPDATE된 데이터도 새 버전 생성
    • 이런 데이터들이 디스크 공간을 계속 차지

VACUUM의 작동 방식​

기본 VACUUM​

VACUUM my_table;
  • 죽은 튜플 식별 및 재사용 가능 표시
  • 디스크 공간을 OS에 반환하지는 않음
  • 테이블 접근 잠금 없이 수행 가능

VACUUM FULL​

VACUUM FULL my_table;
  • 테이블을 완전히 새로 작성
  • 디스크 공간을 OS에 반환
  • 테이블에 대한 배타적 잠금 필요
  • 더 많은 시간과 리소스 소요

ANALYZE​

VACUUM ANALYZE my_table;
  • 테이블의 통계 정보 업데이트
  • 쿼리 플래너의 성능 향상에 도움

AUTOVACUUM​

PostgreSQL은 자동으로 VACUUM을 수행하는 autovacuum 기능을 제공합니다:

-- autovacuum 설정 확인
SHOW autovacuum_vacuum_threshold;
SHOW autovacuum_vacuum_scale_factor;

주요 설정:

  • autovacuum_vacuum_threshold: 최소 죽은 튜플 수
  • autovacuum_vacuum_scale_factor: 테이블 크기 대비 비율
  • autovacuum_vacuum_cost_limit: 리소스 사용량 제한

VACUUM 모니터링​

현재 상태 확인:

SELECT relname, n_live_tup, n_dead_tup, last_vacuum
FROM pg_stat_user_tables
WHERE schemaname = 'public';

bloat 추정:

SELECT schemaname, tablename, 
       pg_size_pretty(bloat_size) as bloat_size,
       round(bloat_ratio::numeric, 2) as bloat_ratio
FROM pg_stats_pretty
WHERE bloat_ratio > 30;

모범 사례​

  1. 정기적인 VACUUM 실행

    • autovacuum 설정 최적화
    • 대규모 DELETE/UPDATE 후 수동 VACUUM 고려
  2. VACUUM FULL 주의사항

    • 유지보수 시간에 실행
    • 충분한 디스크 공간 확보
    • 백업 준비
  3. 모니터링 설정

    • 죽은 튜플 수 추적
    • bloat 수준 관찰
    • VACUUM 활동 로깅

요약​

VACUUM은 PostgreSQL의 건강한 운영을 위한 필수 작업입니다. 적절한 VACUUM 전략은 다음을 보장합니다:

  • 디스크 공간 효율적 사용
  • 쿼리 성능 유지
  • 데이터베이스 안정성 확보

효과적인 VACUUM 관리를 위해서는 데이터베이스 사용 패턴을 이해하고, 적절한 모니터링과 유지보수 계획을 수립하는 것이 중요합니다.